<?php
/**
 * 短信验证码控制器
 *
 * API接口说明：
 * 1. 发送验证码：POST /cloud_market/api/sms/send
 *    参数：mobile(手机号), event(事件类型，可选，默认register)
 *
 * 2. 验证验证码：POST /cloud_market/api/sms/check
 *    参数：mobile(手机号), captcha(验证码), event(事件类型，可选，默认register)
 *
 * 3. 测试发送：GET /cloud_market/api/sms/test
 *    直接发送测试短信
 *
 * 4. 清理过期：GET /cloud_market/api/sms/cleanExpired
 *    清理过期的验证码记录
 *
 * 支持的事件类型：
 * - register: 注册
 * - changepwd: 修改密码
 * - resetpwd: 重置密码
 * - changemobile: 更换手机号
 */
namespace addons\cloud_market\controller\api;

use addons\cloud_market\model\CloudMarketSms;
use addons\cloud_market\utils\Sms as SmsUtils;
use addons\cloud_market\model\CloudMarketUser;
use Overtrue\EasySms\EasySms;
use think\facade\Validate;
use think\facade\Event;

class Sms extends CloudMarketApiController
{
    protected $notApiLogin = ['*'];
    protected $notApiCheck = ['*'];

    protected function initialize()
    {
        parent::initialize();
        $this->model = new CloudMarketSms();
    }

    /**
     * 发送验证码
     *
     * @param string $mobile 手机号
     * @param string $event  事件名称
     */
    public function send()
    {
        $mobile = $this->request->param("mobile");
        $event = $this->request->post("event");
        $event = $event ? $event : 'register'; // login_register / register / change_mobile

        if (!$mobile || !Validate::regex($mobile, "^1\d{10}$")) {
            return $this->error('手机号不正确');
        }

        $last = SmsUtils::get($mobile, $event);
        if ($last && time() - strtotime($last['create_time']) < 60) {
            return $this->error('发送频繁');
        }

        $ipSendTotal = $this->model->where(['ip' => $this->request->ip()])->where('create_time', '>', time() - 3600)->count();
        if ($ipSendTotal >= 5) {
            return $this->error('发送频繁');
        }

        if ($event) {
            $userinfo = CloudMarketUser::where('mobile', $mobile)->find();
            if ($event == 'register' && $userinfo) {
                //已被注册
                return $this->error('已被注册');
            } elseif (in_array($event, ['changemobile']) && $userinfo) {
                //被占用
                return $this->error('已被占用');
            } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
                //未注册
                return $this->error('未注册');
            }
        }

        $ret = SmsUtils::send($mobile, null, $event);
        if ($ret) {
            return $this->success('发送成功');
        } else {
            return $this->error('发送失败，请检查短信配置是否正确');
        }
    }

    /**
     * 检测验证码
     *
     * @param string $mobile  手机号
     * @param string $event   事件名称
     * @param string $captcha 验证码
     */
    public function check()
    {
        $mobile = $this->request->request('mobile');
        $event = $this->request->request('event');
        $event = $event ? $event : 'register';
        $captcha = $this->request->request('captcha');

        if (!$mobile || !Validate::regex($mobile, "^1\d{10}$")) {
            return $this->error('手机号不正确');
        }

        if ($event) {
            $userinfo = CloudMarketUser::where('mobile', $mobile)->find();
            if ($event == 'register' && $userinfo) {
                //已被注册
                return $this->error('已被注册');
            } elseif (in_array($event, ['changemobile']) && $userinfo) {
                //被占用
                return $this->error('已被占用');
            } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
                //未注册
                return $this->error('未注册');
            }
        }

        $ret = SmsUtils::check($mobile, $captcha, $event);
        if ($ret) {
            return $this->success('成功');
        } else {
            return $this->error('验证码不正确');
        }
    }

//    /**
//     * 测试方法 - 直接发送短信
//     */
//    public function test()
//    {
//        $config = [
//            // HTTP 请求的超时时间（秒）
//            'timeout' => 5.0,
//            // 默认发送配置
//            'default' => [
//                // 网关调用策略，默认：顺序调用
//                'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
//                // 默认可用的发送网关
//                'gateways' => [
//                    'yunpian', 'aliyun',
//                ],
//            ],
//            // 可用的网关配置
//            'gateways' => [
//                'errorlog' => [
//                    'file' => '/tmp/easy-sms.log',
//                ],
//                'aliyun' => [
//                    'access_key_id' => 'LTAI5tNnJapat33r7S4x1rC3',
//                    'access_key_secret' => 'LsLaA1MseRfZ9ZoBCCEy1qaiBe2YVt',
//                    'sign_name' => '多客怪兽',
//                ],
//                //...
//            ],
//        ];
//        $easySms = new EasySms($config);
//        $result = $easySms->send(15002831754, [
//            'template' => 'SMS_226995092',
//            'data' => [
//                'code' => 6379
//            ],
//        ]);
//
//        return $this->success('测试发送完成', $result);
//    }

    /**
     * 清理过期验证码
     */
    public function cleanExpired()
    {
        SmsUtils::cleanExpired();
        return $this->success('清理完成');
    }
}
